package com.fruit.mapper.account;

import com.fruit.pojo.account.CashApply;
import com.fruit.pojo.account.CashRule;
import com.fruit.pojo.account.balance.BalanceDetail;
import com.fruit.pojo.account.user.UserAccount;
import com.fruit.pojo.pay.TransactionFlow;
import com.fruit.pojo.user.UserReal;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * 账户mapper
 *
 * @author joe
 * @version 2017.11.30 12:20
 */
public interface AccountMapper {
    /**
     * 查找某个用户指定日期的账单
     *
     * @param uid    用户id
     * @param time   指定日期，格式为：yyyy-MM(查询某月账单)或yyyy-MM-dd(查询某天账单)，如果为null表示查询所有
     * @param offset 分页起始位置，从0开始，小于0表示不分页
     * @param size   分页大小
     * @return 该用户指定日期的账单
     */
    List<TransactionFlow> getCommissionDetails(@Param("uid") long uid, @Param("time") String time, @Param("offset")
            int offset, @Param("size") int size);

    /**
     * 获取某个用户指定日期的余额明细
     *
     * @param uid    用户id
     * @param time   指定日期，格式为：yyyy-MM(查询某月账单)或yyyy-MM-dd(查询某天账单)，如果为null表示查询所有
     * @param offset 分页起始位置，从0开始，小于0表示不分页
     * @param size   分页大小
     * @return 该用户指定日期的余额明细
     */
    List<BalanceDetail> getBalanceDetails(@Param("uid") long uid, @Param("time") String time, @Param("offset")
            int offset, @Param("size") int size);

    /**
     * 获取指定用户的钱包详情
     *
     * @param uid  用户id
     * @param lock 是否加锁，true表示加锁
     * @return 用户钱包，其中仅包含用户余额和用户佣金
     */
    UserAccount getUserAccount(@Param("uid") long uid, @Param("lock") boolean lock);

    /**
     * 查找分销好友的名称
     *
     * @param id 流水ID
     * @return 该流水对应的分销的好友的用户昵称
     */
    String getFriend(@Param("id") long id);

    /**
     * 查找指定流水
     *
     * @param id 佣金ID
     * @return 佣金明细
     */
    TransactionFlow getTransactionFlow(@Param("id") long id);

    /**
     * 查询用户实名认证状态
     *
     * @param uid 用户id
     * @return 用户实名认证状态，返回空表示未申请，00表示未审核，01表示已审核，02表示未通过
     */
    UserReal getUserReal(@Param("uid") long uid);

    /**
     * 保存用户实名认证信息
     *
     * @param userReal 用户实名认证信息
     * @return 返回成功数量
     */
    long saveUserReal(UserReal userReal);

    /**
     * 保存提现申请
     *
     * @param cashApply 提现申请
     * @return 返回成功数量
     */
    long saveCashApply(CashApply cashApply);

    /**
     * 获取提现规则
     *
     * @return 提现规则
     */
    List<CashRule> getCashRule();

    /**
     * 更新提现申请状态
     *
     * @param id    提现ID
     * @param state 要更改的状态，目前只能为01或者02
     * @param uid   操作员ID
     * @return 更新的数量，大于0表示更新成功
     */
    int updateCashout(@Param("id") long id, @Param("state") String state, @Param("uid") String uid);

    /**
     * 查找指定的提现申请记录
     *
     * @param id       ID
     * @param isTranId 是否是流水ID，true表示ID是流水ID，false表示ID是提现本身的ID
     * @return 提现申请
     */
    CashApply getCashout(@Param("id") long id, @Param("isTranId") boolean isTranId);

    /**
     * @param id     认证申请ID
     * @param remark 备注
     * @param state  审核状态
     * @return 返回大于0表示成功
     */
    int updateCertification(@Param("id") long id, @Param("remark") String remark, @Param("state") String state);

    /**
     * 更新用户实名认证信息
     *
     * @param userReal 用户实名认证信息
     * @return 返回大于0表示成功
     */
    int updateCert(UserReal userReal);

    /**
     * 获取用户实名认证列表或者详情（当id大于等于0时表示根据ID获取，当offset大于等于0时表示分页获取，优先按照ID获取）
     *
     * @param offset 分页起始位置
     * @param size   分页大小
     * @param id     实名认证ID
     * @param state  实名认证状态，如果state不等于null那么将只查询state状态的
     * @return 列表
     */
    List<UserReal> getUserReals(@Param("offset") int offset, @Param("size") int size, @Param("id") long id, @Param
            ("state") String state);

    /**
     * 获取用户实名认证信息
     *
     * @param uid 用户UID
     * @return 用户实名认证信息（如果用户申请了但是没通过会返回null）
     */
    UserReal getUserRealByUid(@Param("uid") long uid);

    /**
     * 更新用户账户
     *
     * @param record 用户账户
     * @return 大于0表示更新成功
     */
    int updateByUserId(UserAccount record);

    /**
     * 检查身份证是否有人使用
     *
     * @param card 身份证
     * @return 返回大于0表示有人在使用
     */
    int checkIdCard(@Param("card") String card);

    /**
     * 获取指定日期指定用户的提现总和（通过指定提现方式）
     *
     * @param uid      用户ID
     * @param time     指定日期表达式，例如 ^2017-12-11匹配以2017-12-11开头的所有日期
     * @param cashMode 提现方式，00银行卡，01支付宝
     * @return 指定日期指定用户的提现总和
     */
    BigDecimal countPrice(@Param("uid") long uid, @Param("time") String time, @Param("cashMode") String cashMode);
}
